package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

/**
服务端
 * @author  kongling
 * @package server
 * @date    2023/9/26 上午11:21
*/

func main() {
	listener, err := net.ListenUDP("udp", &net.UDPAddr{
		IP: net.IPv4zero, Port: 9527,
	})
	if err != nil {
		fmt.Println("启动监听失败：", err)
		return
	}
	log.Printf("本地址：%s", listener.LocalAddr().String())
	peers := make([]net.UDPAddr, 0, 2)
	data := make([]byte, 1024)
	for {
		n, remoteAddr, err := listener.ReadFromUDP(data)
		if err != nil {
			log.Printf("读取远程数据失败：%s", err.Error())
			return
		}
		log.Printf("<%s> %s\n", remoteAddr.String(), data[:n])
		peers = append(peers, *remoteAddr)
		if len(peers) == 2 {
			log.Printf("进行UDP打洞，建立 %s <--> %s 的链接\n", peers[0].String(), peers[1].String())
			//WriteToUDP通过c向地址addr发送一个数据包，b为包的有效负载，返回写入的字节。
			//WriteToUDP方***在超过一个固定的时间点之后超时，并返回一个错误。在面向数据包的连接上，写入超时是十分罕见的。
			listener.WriteToUDP([]byte(peers[1].String()), &peers[0])
			listener.WriteToUDP([]byte(peers[0].String()), &peers[1])
			time.Sleep(time.Second * 8)
			log.Println("中转服务器退出，仍不影响peers间通信")
			return
		}
	}
}
